//package org.ejb.stateless;
//
//
//
//import javax.ejb.Stateless;
//import javax.ejb.TransactionAttribute;
//import javax.ejb.TransactionAttributeType;
//import javax.persistence.EntityManager;
//import javax.persistence.PersistenceContext;
//import javax.persistence.Query;
//
//import org.ejb.api.ICatalogRemote;
//import org.ejb.entities.Item;
//import org.ejb.entities.Produit;
//import org.ejb.entities.ValidationException;
//
//import java.util.List;
//import java.util.logging.Logger;
//
///**
// * This class is a facade for all catalog services.
// */
//@SuppressWarnings(value = "unchecked")
//@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
//@Stateless(mappedName = "org.ejb.stateless.CatalogStateless@Remote", description = "Catalog stateless", name = "CatalogStateless")
//public class CatalogStateless implements ICatalogRemote {
//
//    // ======================================
//    // =             Attributs              =
//    // ======================================
//    @PersistenceContext
//    private EntityManager em;
//
//    private final String cname = this.getClass().getName();
//    private Logger logger = Logger.getLogger("org.ejb.stateless");
//
//
//    // ======================================
//    // = Methodes publiques pour produit    =
//    // ======================================
//    public Produit createProduct(final Produit product) {
//        final String mname = "createProduct";
//        logger.entering(cname, mname, product);
//
//        // On s'assure de la validite des paramatres
//        if (product == null)
//            throw new ValidationException("Product object is null");
//
//        //product.setCategory(category);
//
//        // L'objet est persiste en base de donnees
//        em.persist(product);
//
//        logger.exiting(cname, mname, product);
//        return product;
//    }
//
//    public Produit findProduct(final Long productId) {
//        final String mname = "findProduct";
//        logger.entering(cname, mname, productId);
//
//        // On s'assure de la validite des paramatres
//        if (productId == null)
//            throw new ValidationException("Invalid id");
//
//        Produit product;
//
//        // On recherche l'objet a partir de son identifiant
//        product = em.find(Produit.class, productId);
//
//        logger.exiting(cname, mname, product);
//        return product;
//    }
//
//    public void deleteProduct(final Produit product) {
//        final String mname = "deleteProduct";
//        logger.entering(cname, mname, product);
//
//        // On s'assure de la validite des paramatres
//        if (product == null)
//            throw new ValidationException("Product object is null");
//
//        // On supprime l'objet de la base de donnees
//        em.remove(em.merge(product));
//
//        logger.exiting(cname, mname);
//    }
//
//    public Produit updateProduct(final Produit product) {
//        final String mname = "updateProduct";
//        logger.entering(cname, mname, product);
//
//        // On s'assure de la validite des paramatres
//        if (product == null)
//            throw new ValidationException("Product object is null");
//       
//
//        //product.setCategory(category);
//
//        // On modifie l'objet de la base de donnees
//        em.merge(product);
//
//        logger.exiting(cname, mname, product);
//        return product;
//    }
//
//    public List<Produit> findProducts() {
//        final String mname = "findProducts";
//        logger.entering(cname, mname);
//
//        Query query;
//        List<Produit> products;
//
//        // On modifie l'objet de la base de donnees
//        query = em.createQuery("SELECT p FROM Product p ORDER BY p.name");
//        products = query.getResultList();
//
//        logger.exiting(cname, mname, products.size());
//        return products;
//    }
//
//    // ======================================
//    // =   Methodes publiques pour article  =
//    // ======================================
//    public Item createItem(final Item item, final Produit product) {
//        final String mname = "createItem";
//        logger.entering(cname, mname, item);
//
//        // On s'assure de la validite des paramatres
//        if (item == null)
//            throw new ValidationException("Item object is null");
//        if (product == null)
//            throw new ValidationException("Item must be attached to a product");
//
//        item.setProduct(product);
//
//        // L'objet est persiste en base de donnees
//        em.persist(item);
//
//        logger.exiting(cname, mname, item);
//        return item;
//    }
//
//    public Item findItem(final Long itemId) {
//        final String mname = "findItem";
//        logger.entering(cname, mname, itemId);
//
//        // On s'assure de la validite des paramatres
//        if (itemId == null)
//            throw new ValidationException("Invalid id");
//
//        Item item;
//
//        // On recherche l'objet a partir de son identifiant
//        item = em.find(Item.class, itemId);
//
//
//        logger.exiting(cname, mname, item);
//        return item;
//    }
//
//    public void deleteItem(final Item item) {
//        final String mname = "deleteItem";
//        logger.entering(cname, mname, item);
//
//        // On s'assure de la validite des paramatres
//        if (item == null)
//            throw new ValidationException("Item object is null");
//
//        // On supprime l'objet de la base de donnees
//        em.remove(em.merge(item));
//
//        logger.exiting(cname, mname);
//    }
//
//    public Item updateItem(final Item item, final Produit product) {
//        final String mname = "updateItem";
//        logger.entering(cname, mname, item);
//
//        // On s'assure de la validite des paramatres
//        if (item == null)
//            throw new ValidationException("Item object is null");
//        if (product == null)
//            throw new ValidationException("Item must be attached to a product");
//
//        item.setProduct(product);
//
//        // On modifie l'objet de la base de donnees
//        em.merge(item);
//
//        logger.exiting(cname, mname, item);
//        return item;
//    }
//
//    public List<Item> findItems() {
//        final String mname = "findItems";
//        logger.entering(cname, mname);
//
//        Query query;
//        List<Item> items;
//
//        // On modifie l'objet de la base de donnees
//        query = em.createQuery("SELECT i FROM Item i ORDER BY i.name");
//        items = query.getResultList();
//
//        logger.exiting(cname, mname, items.size());
//        return items;
//    }
//
//
//    public List<Item> searchItems(final String keyword) {
//        final String mname = "searchItems";
//        logger.entering(cname, mname, keyword);
//
//        Query query;
//        List<Item> items;
//
//        // On modifie l'objet de la base de donnees
//        query = em.createQuery("SELECT i FROM Item i WHERE UPPER(i.name) LIKE :keyword OR UPPER(i.product.name) LIKE :keyword ORDER BY i.product.name");
//        query.setParameter("keyword", "%" + keyword.toUpperCase() + "%");
//        items = query.getResultList();
//
//        logger.exiting(cname, mname, items.size());
//        return items;
//    }
//    // ======================================
//    // =           Methodes Privees         =
//    // ======================================
//}
//
